package com.tree.backend.controller;

import com.tree.backend.common.Result;
import com.tree.backend.entity.dto.auth.LoginRequestDTO;
import com.tree.backend.entity.dto.user.UserAddDTO;
import com.tree.backend.entity.dto.user.UserQueryDTO;
import com.tree.backend.entity.dto.user.UserStatusUpdateDTO;
import com.tree.backend.entity.dto.user.UserUpdateDTO;
import com.tree.backend.entity.vo.PageVO;
import com.tree.backend.entity.vo.auth.LoginResponseVO;
import com.tree.backend.entity.vo.auth.UserInfoVO;
import com.tree.backend.entity.vo.user.RoleTypeVO;
import com.tree.backend.entity.vo.user.UserVO;
import com.tree.backend.service.IUserService;
import com.tree.backend.utils.UserContext;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 系统用户表 前端控制器
 * </p>
 */
@RestController
@RequestMapping({"/user", "/users"})
@RequiredArgsConstructor
public class UserController {

    private final IUserService userService;

    /**
     * 登录接口
     *
     * @param loginRequestDTO 登录请求参数
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<LoginResponseVO> login(@RequestBody LoginRequestDTO loginRequestDTO) {
        LoginResponseVO loginResponseVO = userService.login(loginRequestDTO.getUsername(), loginRequestDTO.getPassword());
        return Result.success(loginResponseVO);
    }

    /**
     * 登出接口
     *
     * @return 登出结果
     */
    @PostMapping("/logout")
    public Result<String> logout() {
        // 从UserContext中获取用户名
        String username = UserContext.getUsername();

        // 调用服务层登出方法
        userService.logout(username);

        return Result.success("登出成功");
    }

    /**
     * 获取用户信息接口
     *
     * @return 用户信息
     */
    @GetMapping("/info")
    public Result<UserInfoVO> getUserInfo() {
        // 从UserContext中获取用户名
        String username = UserContext.getUsername();

        // 调用服务层获取用户信息方法
        UserInfoVO userInfoVO = userService.getUserInfo(username);

        return Result.success(userInfoVO);
    }

    /**
     * 获取用户列表
     *
     * @param queryDTO 查询参数
     * @return 用户列表
     */
    @GetMapping("/list")
    public Result<PageVO<UserVO>> getUsers(UserQueryDTO queryDTO) {
        PageVO<UserVO> userPage = userService.getUsers(queryDTO);
        return Result.success(userPage);
    }
    
    /**
     * 获取所有用户列表（不分页）
     */
    @GetMapping("")
    public Result<List<UserVO>> getAllUsers() {
        List<UserVO> users = userService.getAllUsers();
        return Result.success(users);
    }

    /**
     * 获取用户详情
     *
     * @param id 用户ID
     * @return 用户详情
     */
    @GetMapping("/{id}")
    public Result<UserVO> getUserById(@PathVariable Integer id) {
        UserVO userVO = userService.getUserById(id);
        return Result.success(userVO);
    }

    /**
     * 新增用户
     *
     * @param userAddDTO 用户信息
     * @return 新增结果
     */
    @PostMapping
    public Result<String> addUser(@RequestBody UserAddDTO userAddDTO) {
        userService.addUser(userAddDTO);
        return Result.success("新增用户成功");
    }

    /**
     * 更新用户
     *
     * @param id         用户ID
     * @param userUpdateDTO 更新信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    public Result<String> updateUser(@PathVariable Integer id, @RequestBody UserUpdateDTO userUpdateDTO) {
        userService.updateUser(id, userUpdateDTO);
        return Result.success("更新用户成功");
    }

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public Result<String> deleteUser(@PathVariable Integer id) {
        userService.deleteUser(id);
        return Result.success("删除用户成功");
    }

    /**
     * 更新用户状态
     *
     * @param id           用户ID
     * @param statusUpdateDTO 状态信息
     * @return 更新结果
     */
    @PutMapping("/{id}/status")
    public Result<String> updateUserStatus(@PathVariable Integer id, @RequestBody UserStatusUpdateDTO statusUpdateDTO) {
        userService.updateUserStatus(id, statusUpdateDTO.getStatus());
        return Result.success("更新状态成功");
    }

    /**
     * 获取角色类型列表
     *
     * @return 角色类型列表
     */
    @GetMapping("/roleTypes")
    public Result<List<RoleTypeVO>> getRoleTypes() {
        List<RoleTypeVO> roleTypes = userService.getRoleTypes();
        return Result.success(roleTypes);
    }

    /**
     * 搜索用户
     *
     * @param queryDTO 搜索参数
     * @return 搜索结果
     */
    @GetMapping("/search")
    public Result<PageVO<UserVO>> searchUsers(UserQueryDTO queryDTO) {
        PageVO<UserVO> userPage = userService.searchUsers(queryDTO);
        return Result.success(userPage);
    }
}
